home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / ToolManager / Source / Converter / converter.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  7KB  |  257 lines

  1. /*
  2.  * converter.c  V3.1
  3.  *
  4.  * ToolManager preferences file converter (2.x -> 3.x)
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. #include "converter.h"
  17.  
  18. /* Local data */
  19. static const char Version[]       = "$VER: TMPrefsConverter " TMVERSION
  20.                                     " (" __COMMODORE_DATE__ ")";
  21. #define TMCONFIGNAME "ToolManager.prefs" /* TEMPORARY! */
  22. static const char PrefsFileName[] = "ENVARC:" TMCONFIGNAME;
  23. static const char NewFileName[]   = "ENVARC:" TMCONFIGNAME ".new";
  24.  
  25. /* Global data */
  26. extern struct Library *DOSBase;
  27. extern struct Library *IFFParseBase;
  28.  
  29. /* Check ToolManager 2.x preferences file */
  30. static BOOL CheckOldPrefs(struct IFFHandle *iffh)
  31. {
  32.  struct ContextNode *cn;
  33.  struct PrefHeader   ph;
  34.  
  35.  /* a) Do first parse step       */
  36.  /* b) Check for FORM PREF chunk */
  37.  /* c) Check for PRHD chunk      */
  38.  /* d) Read PRHD chunk           */
  39.  /* e) Check for version 0       */
  40.  /* f) Do next Parse step        */
  41.  return((ParseIFF(iffh, IFFPARSE_STEP) == 0) &&
  42.         (cn = CurrentChunk(iffh)) && (cn->cn_ID   == ID_FORM) &&
  43.                                      (cn->cn_Type == ID_PREF) &&
  44.         (ParseIFF(iffh, IFFPARSE_STEP) == 0) &&
  45.         (cn = CurrentChunk(iffh)) && (cn->cn_ID   == ID_PRHD) &&
  46.         (ReadChunkBytes(iffh, &ph, sizeof(struct PrefHeader))
  47.           == sizeof(struct PrefHeader)) &&
  48.         (ph.ph_Version == 0) &&
  49.         (ParseIFF(iffh, IFFPARSE_STEP) == IFFERR_EOC));
  50. }
  51.  
  52. /* Prepare ToolManager 3.0 preferences file */
  53. static BOOL PrepareNewPrefs(struct IFFHandle *iffh)
  54. {
  55.  struct GlobalDATAChunk gdc;
  56.  
  57.  /* Initialize DATA chunk */
  58.  gdc.gdc_Flags     = DATA_GLOBALF_REMAPENABLE;
  59.  gdc.gdc_Precision = DATA_GLOBAL_PRECISION_DEFAULT;
  60.  
  61.         /* a) Push FORM TMPR chunk         */
  62.         /* b) Push, write & pop FVER chunk */
  63.         /* c) Push FORM TMGP chunk         */
  64.         /* d) Push, write & pop DATA chunk */
  65.         /* e) Pop FORM TMGP chunk          */
  66.  return((PushChunk(iffh, ID_TMPR, ID_FORM, IFFSIZE_UNKNOWN) == 0)        &&
  67.         (PushChunk(iffh, 0,       ID_FVER, IFFSIZE_UNKNOWN) == 0)        &&
  68.         (WriteChunkBytes(iffh, TMCONFIGVERSION, sizeof(TMCONFIGVERSION))
  69.           == sizeof(TMCONFIGVERSION))                                    &&
  70.         (PopChunk(iffh) == 0)                                            &&
  71.         (PushChunk(iffh, ID_TMGP, ID_FORM, IFFSIZE_UNKNOWN) == 0)        &&
  72.         (PushChunk(iffh, 0,       ID_DATA, IFFSIZE_UNKNOWN) == 0)        &&
  73.         (WriteChunkBytes(iffh, &gdc, sizeof(struct GlobalDATAChunk))
  74.          == sizeof(struct GlobalDATAChunk))                              &&
  75.         (PopChunk(iffh) == 0)                                            &&
  76.         (PopChunk(iffh) == 0));
  77. }
  78.  
  79. /* CLI main entry point */
  80. #define DEBUGFUNCTION main
  81. int main(int argc, char **argv)
  82. {
  83.  int rc = RETURN_FAIL;
  84.  
  85.  INITDEBUG(ToolManagerConverterDebug)
  86.  
  87.  /* Workbench startup? Yes, make sure that stdout is open */
  88.  if ((argc != 0) ||
  89.       freopen("CON:0/0/640/200/ToolManager Prefs Conversion/WAIT/CLOSE/AUTO",
  90.               "w", stdout)) {
  91.   struct IFFHandle *OldIFFHandle;
  92.  
  93.   /* Print banner */
  94.   printf("%s\n", &Version[6]);
  95.  
  96.   /* Initialize memory pool */
  97.   if (InitMemory()) {
  98.  
  99.    /* Print progress */
  100.    printf("Opening ToolManager 2.x Preferences...");
  101.    fflush(stdout);
  102.  
  103.    /* Allocate IFF Handle for old prefs file */
  104.    if (OldIFFHandle = AllocIFF()) {
  105.  
  106.     MAIN_LOG(LOG1(Old IFF Handle, "0x%08lx", OldIFFHandle))
  107.  
  108.     /* Open old prefs file */
  109.     if (OldIFFHandle->iff_Stream = Open(PrefsFileName, MODE_OLDFILE)) {
  110.  
  111.      MAIN_LOG(LOG1(Old File Handle, "0x%08lx", OldIFFHandle->iff_Stream))
  112.  
  113.      /* Initialize IFF handle */
  114.      InitIFFasDOS(OldIFFHandle);
  115.  
  116.      /* Open IFF handle */
  117.      if (OpenIFF(OldIFFHandle, IFFF_READ) == 0) {
  118.       struct IFFHandle *NewIFFHandle;
  119.  
  120.       MAIN_LOG(LOG0(Old IFF Handle open))
  121.  
  122.       /* Check old prefs file */
  123.       if (CheckOldPrefs(OldIFFHandle)) {
  124.  
  125.        MAIN_LOG(LOG0(Old Prefs file OK))
  126.  
  127.        printf(" OK\nOpening ToolManager 3.0 Preferences...");
  128.        fflush(stdout);
  129.  
  130.        /* Allocate IFF Handle for new prefs file */
  131.        if (NewIFFHandle = AllocIFF()) {
  132.  
  133.         MAIN_LOG(LOG1(New IFF Handle, "0x%08lx", NewIFFHandle))
  134.  
  135.         /* Open new prefs file */
  136.         if (NewIFFHandle->iff_Stream = Open(NewFileName, MODE_NEWFILE)) {
  137.          ULONG protection = 0;
  138.  
  139.          MAIN_LOG(LOG1(New File Handle, "0x%08lx", NewIFFHandle->iff_Stream))
  140.  
  141.          /* Set protection bits */
  142.          {
  143.           struct FileInfoBlock *fib;
  144.  
  145.           /* Allocate file info block */
  146.           if (fib = AllocDosObject(DOS_FIB, NULL)) {
  147.  
  148.            MAIN_LOG(LOG1(FIB, "0x%08lx", fib))
  149.  
  150.            /* Examine file */
  151.            if (ExamineFH(NewIFFHandle->iff_Stream, fib)) {
  152.  
  153.             MAIN_LOG(LOG1(Old protection bits, "0x%08lx", fib->fib_Protection))
  154.  
  155.             /* Copy protection bits */
  156.             protection = fib->fib_Protection;
  157.  
  158.             /* Clear execute flag */
  159.             SetProtection(NewFileName, fib->fib_Protection | FIBF_EXECUTE);
  160.            }
  161.  
  162.            /* Free file info block */
  163.            FreeDosObject(DOS_FIB, fib);
  164.           }
  165.          }
  166.  
  167.          /* Initialize IFF handle */
  168.          InitIFFasDOS(NewIFFHandle);
  169.  
  170.          /* Open IFF handle */
  171.          if (OpenIFF(NewIFFHandle, IFFF_WRITE) == 0) {
  172.  
  173.            MAIN_LOG(LOG0(New IFF Handle open))
  174.  
  175.            /* Prepare new preferences file */
  176.            if (PrepareNewPrefs(NewIFFHandle)) {
  177.  
  178.             MAIN_LOG(LOG0(New Prefs prepared))
  179.  
  180.             printf(" OK\nConverting");
  181.             fflush(stdout);
  182.  
  183.             /* Scan old preferences file */
  184.             if (ScanOldConfig(OldIFFHandle, NewIFFHandle)) {
  185.  
  186.              MAIN_LOG(LOG0(Converted))
  187.  
  188.              /* Complete new preferences file */
  189.              if (PopChunk(NewIFFHandle) == 0) {
  190.  
  191.               MAIN_LOG(LOG0(New Prefs completed))
  192.  
  193.               /* All OK */
  194.               rc = TRUE;
  195.              }
  196.             }
  197.            }
  198.  
  199.           CloseIFF(NewIFFHandle);
  200.          }
  201.          Close(NewIFFHandle->iff_Stream);
  202.  
  203.          /* Clear execute flag */
  204.          SetProtection(NewFileName, protection | FIBF_EXECUTE);
  205.         }
  206.         FreeIFF(NewIFFHandle);
  207.        }
  208.       }
  209.       CloseIFF(OldIFFHandle);
  210.      }
  211.      Close(OldIFFHandle->iff_Stream);
  212.     }
  213.     FreeIFF(OldIFFHandle);
  214.    }
  215.  
  216.    /* Error? */
  217.    if (rc == RETURN_FAIL) {
  218.  
  219. #ifndef DEBUG
  220.     /* Delete new file */
  221.     DeleteFile(NewFileName);
  222. #endif
  223.  
  224.     printf(" ***FAILED***!\n");
  225.  
  226.    } else {
  227.  
  228.     MAIN_LOG(LOG0(Renaming Files))
  229.  
  230. #ifndef DEBUG
  231.     /* All OK, rename files */
  232.     Rename(PrefsFileName, "ENVARC:" TMCONFIGNAME ".old");
  233.     Rename(NewFileName,   PrefsFileName);
  234. #endif
  235.  
  236.     printf(" DONE\nOld Preferences file has been renamed to: "
  237.             "ENVARC:" TMCONFIGNAME ".old\n" );
  238.    }
  239.  
  240.    DeleteMemory();
  241.   }
  242.  }
  243.  
  244.  MAIN_LOG(LOG1(Result, "%ld", rc))
  245.  
  246.  return(rc);
  247. }
  248.  
  249. #ifdef _DCC
  250. /* Workbench main entry point */
  251. int wbmain(struct WBStartup *wbs)
  252. {
  253.  /* Just call the CLI entry with argc set to zero */
  254.  return(main(0, NULL));
  255. }
  256. #endif
  257.